package util.states;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import enums.EPState;
import models.Periodo;
import models.CalendarioAcademico;
import services.DAO;
import services.ErrorManager;

public class ConfiguracionCalendarioState extends StateLogic {

	public ConfiguracionCalendarioState() {

	}

	@Override
	public List<String> validateTransition() {
		List<String> errores = new ArrayList<String>();
		if (colegio.getIdCalendarioAcademicoActual() == null) {
			errores.add("Contactar al proveedor. Colegio en estado CONFIG_PERIODO no tiene id de calendario actual");
			ErrorManager
					.reportError(
							"Colegio en estado CONFIG_PERIODO no tiene id de calendario actual",
							colegio);
		} else {
			CalendarioAcademico pa = DAO.find(CalendarioAcademico.class,
					colegio.getIdCalendarioAcademicoActual());
			if (pa.getPeriodos().size() != pa.getNumPeriodos()) {
				errores.add("Contactar al proveedor. El numero de periodos no es consistente");
				ErrorManager.reportError(
						"El numero de periodos no es consistente", colegio);
			}
			if (pa.getNumPeriodos() <= 0) {
				errores.add("El número de periodos debe ser mayor o igual a 1");
			}

		}

		return errores;
	}

	@Override
	public EPState getNext() {
		return EPState.MATRICULAS;
	}

	@Override
	public void enterTransition() {

		CalendarioAcademico ca = new CalendarioAcademico();
		ca.setNumPeriodos(4);
		Calendar now = GregorianCalendar.getInstance();
		int year = now.get(Calendar.MONTH) >= 7 ? now.get(Calendar.YEAR) + 1
				: now.get(Calendar.YEAR);

		ca.setDescripcion(year + "");
		Calendar fin = new GregorianCalendar(year, 11, 1);
		Calendar inicio = new GregorianCalendar(year, 1, 1);
		Long duracionCalendario = (fin.getTimeInMillis() - inicio
				.getTimeInMillis()) / 4;
		Long inicioPeriodo = inicio.getTimeInMillis();
		ca.setFechaFin(fin.getTime());
		ca.setFechaInicio(inicio.getTime());
		ca.setIdColegio(colegio.getId());

		List<Periodo> periodos = new ArrayList<Periodo>();
		for (int i = 0; i < ca.getNumPeriodos(); i++) {
			Periodo c = new Periodo();
			c.setNumero(i + 1);
			c.setFechaIncio(new Date(inicioPeriodo));
			c.setFechaFin(new Date(inicioPeriodo + duracionCalendario));
			c.setCalendarioAcademico(ca);
			inicioPeriodo += duracionCalendario;
			periodos.add(c);

		}
		ca.setPeriodos(periodos);
		DAO.persist(ca);
		DAO.flush();
		colegio.setState(EPState.CONFIG_PERIODO);
		colegio.setIdCalendarioAcademicoActual(ca.getId());

	}

}
